#ifndef OS_MEM_H
#define OS_MEM_H

#include "os_types.h"
#include "os_cfg.h"

#define OS_MEM_MAGIC_VALUE          0x55AA33BB      // 完整性检查的数字

/**
 * 内存块起始标记(目前12字节)
*/
typedef struct _os_mem_item_t {
#if OS_MEM_DBG_CHECK
    uint32_t magic;                         // 完整性检查的数字
#endif
    struct _os_mem_item_t * pre; 
    struct _os_mem_item_t * next; 

    struct {
        unsigned int used : 1;                  // 是否已经被分配出去
        unsigned int data_size : 31;                 // 整个空闲块的大小
    };
}os_mem_item_t;

typedef struct _os_mem_list_t {
    os_mem_item_t item;                        // 链接结点
    void * heap_start;                          // 整个可用堆的起始地址
}os_mem_t;

os_err_t os_mem_init (void);
void * os_mem_malloc (int size);
os_err_t os_mem_free (void * mem);
int os_get_free_size (void);

#if OS_MEM_DBG_CHECK
void os_mem_check (void);
#endif

#endif // OS_MEM_H

